package repository

import (
	"gorm.io/gorm"
)

// Container 是一个Repository容器，统一管理所有repository依赖
type Container struct {
	// 数据库连接（用于向后兼容直接GORM操作）
	db *gorm.DB

	User             UserRepository
	Admin            AdminRepository
	Conversation     ConversationRepository
	ClientMessage    ClientMessageRepository
	LLMMessage       LLMMessageRepository
	LLMProvider      LLMProviderRepository
	SystemPrompt     SystemPromptRepository
	ToolDBConnection ToolDBConnectionRepository
	Tool             SimpleToolRepository
	Schema           SchemaRepository
}

// ContainerInterface 定义Repository容器的接口
type ContainerInterface interface {
	// Repository访问方法
	GetUser() UserRepository
	GetAdmin() AdminRepository
	GetConversation() ConversationRepository
	GetClientMessage() ClientMessageRepository
	GetLLMMessage() LLMMessageRepository
	GetLLMProvider() LLMProviderRepository
	GetSystemPrompt() SystemPromptRepository
	GetToolDBConnection() ToolDBConnectionRepository
	GetTool() SimpleToolRepository
	GetSchema() SchemaRepository

	// 向后兼容方法 - 用于逐步迁移到repository
	GetDB() *gorm.DB
}

// NewContainer 创建新的Repository容器实例
func NewContainer(db *gorm.DB) *Container {
	return &Container{
		db:               db,
		User:             NewUserRepository(db),
		Admin:            NewAdminRepository(db),
		Conversation:     NewConversationRepository(db),
		ClientMessage:    NewClientMessageRepository(db),
		LLMMessage:       NewLLMMessageRepository(db),
		LLMProvider:      NewLLMProviderRepository(db),
		SystemPrompt:     NewSystemPromptRepository(db),
		ToolDBConnection: NewToolDBConnectionRepository(db),
		Tool:             NewSimpleToolRepository(db),
		Schema:           NewSchemaRepository(db),
	}
}

// GetUser 返回UserRepository
func (c *Container) GetUser() UserRepository {
	return c.User
}

// GetAdmin 返回AdminRepository
func (c *Container) GetAdmin() AdminRepository {
	return c.Admin
}

// GetConversation 返回ConversationRepository
func (c *Container) GetConversation() ConversationRepository {
	return c.Conversation
}

// GetClientMessage 返回ClientMessageRepository
func (c *Container) GetClientMessage() ClientMessageRepository {
	return c.ClientMessage
}

// GetLLMMessage 返回LLMMessageRepository
func (c *Container) GetLLMMessage() LLMMessageRepository {
	return c.LLMMessage
}

// GetLLMProvider 返回LLMProviderRepository
func (c *Container) GetLLMProvider() LLMProviderRepository {
	return c.LLMProvider
}

// GetSystemPrompt 返回SystemPromptRepository
func (c *Container) GetSystemPrompt() SystemPromptRepository {
	return c.SystemPrompt
}

// GetToolDBConnection 返回ToolDBConnectionRepository
func (c *Container) GetToolDBConnection() ToolDBConnectionRepository {
	return c.ToolDBConnection
}

// GetTool 返回SimpleToolRepository
func (c *Container) GetTool() SimpleToolRepository {
	return c.Tool
}

// GetSchema 返回SchemaRepository
func (c *Container) GetSchema() SchemaRepository {
	return c.Schema
}

// GetDB 返回数据库连接（向后兼容方法）
func (c *Container) GetDB() *gorm.DB {
	return c.db
}
